home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 8: LINUX Games / Linux Cubed Series 8 - LINUX Games.iso / games / x11 / rpg / crossfir.92 / crossfir / crossfire-0.92.5 / server / swap.c < prev    next >
C/C++ Source or Header  |  1996-07-24  |  4KB  |  156 lines

  1. /*
  2.  * static char *rcsid_swap_c =
  3.  *    "$Id: swap.c,v 1.10 1994/10/07 10:07:42 master Exp $";
  4.  */
  5.  
  6. /*
  7.     CrossFire, A Multiplayer game for X-windows
  8.  
  9.     Copyright (C) 1992 Frank Tore Johansen
  10.  
  11.     This program is free software; you can redistribute it and/or modify
  12.     it under the terms of the GNU General Public License as published by
  13.     the Free Software Foundation; either version 2 of the License, or
  14.     (at your option) any later version.
  15.  
  16.     This program is distributed in the hope that it will be useful,
  17.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  18.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  19.     GNU General Public License for more details.
  20.  
  21.     You should have received a copy of the GNU General Public License
  22.     along with this program; if not, write to the Free Software
  23.     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  24.  
  25.     The author can be reached via e-mail to frankj@ifi.uio.no.
  26. */
  27.  
  28. #include <global.h>
  29. #ifndef __CEXTRACT__
  30. #include <sproto.h>
  31. #endif
  32. #include <object.h>
  33.  
  34. void swap_map(mapstruct *map) {
  35.   player *pl;
  36.   if(map->in_memory != MAP_IN_MEMORY) {
  37.     LOG(llevError,"Tried to swap out map which was not in memory.\n");
  38.     return;
  39.   }
  40.   for(pl=first_player;pl!=NULL;pl=pl->next)
  41.     if(pl->ob == NULL || (!(QUERY_FLAG(pl->ob,FLAG_REMOVED)) && pl->ob->map == map))
  42.       break;
  43.   if(pl != NULL) {
  44.     LOG(llevDebug,"Wanted to swap out map with player.\n");
  45.     return;
  46.   }
  47.   remove_all_pets(map); /* Give them a chance to follow */
  48.  
  49.   /* Update the reset time.  Only do this is STAND_STILL is not set */
  50.   if (!QUERY_FLAG(map->map_object, FLAG_STAND_STILL))
  51.     set_map_reset_time(map);
  52.  
  53.   if (new_save_map (map, 0) == -1) {
  54.     LOG(llevError, "Failed to swap map %s.\n", map->path);
  55.     delete_map(map);
  56.   } else
  57.     free_map(map,1);
  58. }
  59.  
  60. void check_active_maps() {
  61.   mapstruct *map;
  62.  
  63.   for(map=first_map;map!=NULL;map=map->next) {
  64.     if(map->in_memory != MAP_IN_MEMORY)
  65.       continue;
  66.     if(map->need_refresh) {
  67.       map->need_refresh=0;
  68.       refresh_map(map);
  69.     }
  70.     if(!map->timeout)
  71.       continue;
  72.     if( --(map->timeout) > 0)
  73.       continue;
  74.     swap_map(map);
  75.   }
  76. }
  77.  
  78. /*
  79.  * map_least_timeout() returns the map with the lowest timeout variable (not 0)
  80.  */
  81.  
  82. mapstruct *map_least_timeout(char *except_level) {
  83.   mapstruct *map, *chosen=NULL;
  84.   int timeout = MAP_MAXTIMEOUT + 1;
  85.   for(map = first_map;map != NULL; map = map->next)
  86.     if(map->in_memory == MAP_IN_MEMORY && strcmp (map->path, except_level) &&
  87.        map->timeout && map->timeout < timeout)
  88.     chosen = map, timeout = map->timeout;
  89.   return chosen;
  90. }
  91.  
  92. /*
  93.  * swap_below_max() tries to swap out maps which are still in memory because
  94.  * of MAP_TIMEOUT until used objects is below MAX_OBJECTS or there are
  95.  * no more maps to swap.
  96.  */
  97.  
  98. void swap_below_max(char *except_level) {
  99.   mapstruct *map;
  100.  
  101.   for(;;) {
  102.     if(nrofallocobjects - nroffreeobjects < MAX_OBJECTS)
  103.       return;
  104.     if ((map = map_least_timeout(except_level)) == NULL)
  105.       return;
  106.     LOG(llevDebug,"Trying to swap out %s before its time.\n", map->path);
  107.     map->timeout=0;
  108.     swap_map(map);
  109.   }
  110. }
  111.  
  112. /*
  113.  * players_on_map(): will be replaced by map->players when I'm satisfied
  114.  * that the variable is always correct.
  115.  */
  116.  
  117. int players_on_map(mapstruct *m) {
  118.   player *pl;
  119.   int nr=0;
  120.   for(pl=first_player;pl!=NULL;pl=pl->next)
  121.     if(pl->ob != NULL && !QUERY_FLAG(pl->ob,FLAG_REMOVED) && pl->ob->map==m)
  122.       nr++;
  123.   return nr;
  124. }
  125.  
  126. /*
  127.  * flush_old_maps():
  128.  * Removes tmp-files of maps which are going to be reset next time
  129.  * they are visited.
  130.  * This is very useful if the tmp-disk is very full.
  131.  */
  132. void flush_old_maps() {
  133. #ifdef MAP_RESET /* No need to flush them if there are no resets */
  134.  
  135.   mapstruct *m, *oldmap;
  136.   long sec;
  137.  
  138.   sec = seconds();
  139.  
  140.   m= first_map;
  141.   while (m) {
  142.     if(m->in_memory != MAP_SWAPPED || m->tmpname == NULL ||
  143.        sec < m->reset_time) {
  144.     m = m->next;
  145.        }
  146.     else {
  147.     LOG(llevDebug,"Resetting map %s.\n",m->path);
  148.     clean_tmp_map(m);
  149.     oldmap = m;
  150.     m = m->next;
  151.     delete_map(oldmap);
  152.     }
  153.   }
  154. #endif
  155. }
  156.